todo-19-latency-oriented-polish.md 2.1 KB

Todo 19 Latency-Oriented Polish Plan

Status: done

Goal

Reduce perceived reply wait time with earlier event visibility and clearer frontend waiting feedback.

Design

  • Emit event output as soon as ChatAgent streaming produces an event, instead of waiting for the full model stream to finish.
  • Keep EventAgent execution after the assistant turn is finalized so history remains provider-compatible.
  • Show the user's submitted message immediately, disable the run button while streaming, and update elapsed time while waiting for the first token.
  • Add lightweight WebSocket logger entries for backend session boundaries.

Files

  • Modify: src/agent_lab/application/runtime.py
  • Modify: src/agent_lab/presentation/web.py
  • Modify: src/agent_lab/presentation/static/index.html
  • Modify: src/agent_lab/presentation/static/app.js
  • Modify: src/agent_lab/presentation/static/styles.css
  • Modify: tests/test_debug_runtime.py
  • Modify: tests/test_websocket_api.py
  • Modify: docs/plans/todos.md

Verification

  • Runtime test proves event messages reach the output queue before the ChatAgent stream is released.
  • WebSocket test proves backend logger records session lifecycle events.
  • Static UI tests prove immediate user echo, waiting state, disabled run button, and live elapsed timer hooks.
  • Full suite passes with uv run pytest.

Result

  • Runtime now emits event output immediately when the ChatAgent stream detects an event.
  • WebSocket service logs accepted, validated, terminal, rejected, failed, disconnected, and closed lifecycle states.
  • Frontend now echoes the submitted user message immediately, disables Run while active, shows "Waiting for first token", and keeps elapsed time moving before the first token.
  • Review follow-up: elapsed no longer freezes when an event-only first round emits round_stats before the first assistant token.
  • Tools management is moved to the top of the sidebar so it is visible in the first viewport.
  • Verified with focused tests, uv run pytest (49 passed), and local browser checks at http://127.0.0.1:8001.