Skip to main content
Status: Durable run streaming is available against the partner-preview gateway. Exact browser approval events remain pending production activation. Cancellation-reconciliation code is deployed, but final-status behavior remains pending a separate live canary. The SDK is source-available but is not published to npm.
Use streamRunEvents() for GET /v1/runs/:id/events. Each event has this shared envelope:

Durable event vocabulary

Only run.completed, run.failed, and run.cancelled are terminal. Rich candidate model, text, tool, memory, output, usage, and request.* turn events in the source repository are offline schemas. They are not emitted by the public task projector and have no public streaming method.

Consume events

Aborting the local stream stops that read. It does not cancel the durable run. Call cancelRun() separately if you intend to request cancellation.

Reconnect with Last-Event-ID

Persist a sequence only after your event handler commits its work. Pass that sequence as lastEventId when reconnecting:
The client sends Last-Event-ID and verifies that every returned SSE id is numeric and equals the event’s sequence. It also verifies the run_id, strictly increasing sequences, terminal ordering, and EOF behavior. Reconnect explicitly after a transport failure; the SDK does not retry a stream automatically.

Reconciliation final-status contract

The migration and compatible Workers are deployed, but this path remains pending a separate live canary. Once that gate clears, reconciliation uses run.progress; it does not add a status or event type. The stream remains open while the run projects as running. Treat this exact message as a no-retry signal:
Successful recovery emits:
If Praxa cannot verify a committing outcome, the stream ends with run.failed, failure.code: "run_outcome_unknown", and retryable: false. Inspect the external system before submitting replacement work.

Approval events after activation

approval.required contains the exact server-issued summary and action digest. Render the summary unchanged. Return the digest through approveRun() or denyRun(). The server re-derives the presentation and rejects a missing, stale, unsupported, foreign, or mismatched digest. Continue with Errors and retries for request failures and cancellation semantics.
Last modified on August 14, 2026