report_progress tool

Overview

The report_progress tool lets the model report real-time progress on a long-running operation. The server validates the call, emits a progress_update SSE event, and the frontend renders a live progress bar card in the transcript. The tool is advertised to all models that support tool calling when its project authorization mode is not off.

Usage

The model calls report_progress with this schema:

{
  "title": "Building project",
  "current": 5,
  "total": 100,
  "status": "running",
  "message": "Compiling source files..."
}
FieldTypeRequiredDescription
titlestringyesShort description of the operation (max 120 chars)
currentnumberyesCurrent progress value (0-based)
totalnumberyesMaximum progress value (must be positive)
statusstringno"running", "completed", or "failed" (default: "running")
messagestringnoOptional status message shown below the progress bar (max 500 chars)

Authorization

report_progress appears in Settings → Project with the same off / ask / allow modes as other native tools. off hides it from model requests, while ask and allow keep it visible. Execution bypasses the interactive authorization prompt because progress updates do not read or modify project resources; the mode is used as the visibility gate. Legacy or external calls can still be dispatched directly for compatibility.

Frontend rendering

When the server emits a progress_update SSE event, the frontend renders a .tool-card--progress card in the transcript with:

Notifications

Each progress_update also drives a per-chat updatable browser push notification (tag chat-<id>-status), so a background chat keeps the user in the loop without leaving a second progress notification beside the final completion/error notification. The notification title carries the chat title plus the cumulative token/cost label for this turn (e.g. "my-project · 12.4K tok · $0.03") — progress and usage together; the body shows the live percentage and message. When a status: "completed" update arrives, the card turns green and the final completion notification replaces that status slot so the end of a long task is visible if the chat is not open.