A capture in. A runnable artifact out.
Use a focused capture you are allowed to inspect. Keep its original events and application context so another run can answer the same question.
Reviewed October 15, 2026 · Pinned npm clients 0.0.59 and 1.0.2 · Original local fixtures
Accepted input
Load a JSON array of event objects, one JSON object per line, or plain SSE data: frames. Every event needs a string type. SSE comments and standard event/id/retry fields are accepted; data lines in one frame are joined before JSON parsing. An unterminated final frame is retained but marks the capture incomplete.
The tool does not guess the structure of a browser-extension export wrapper. Extract its event list first. It accepts up to 8 MiB of combined capture and initial context, 5,000 events, 48 levels and 200,000 input nodes. Prototype-related property names are rejected by this local tool’s input boundary.
↓ Original SSE fixture, with frame boundariesCapture without inventing missing data
Use your application’s event logging or the free AG-UI DevTools where capture is the job. Include the relevant run-start and terminal events. If the capture begins in the middle or misses a terminal event, RunBridge reports that boundary independently of the SDK promise.
The editor’s optional context accepts only initialState and initialMessages. They initialize each real client. Do not insert a guessed state merely to make a result look successful. Use an empty context when it matches the captured scenario.
What the download contains
original-capture.txtpreserves your selected source text.input.jsonrecords parsed events, initial context and the reviewed plan.original.sseand the two reviewed SSE files make branch differences inspectable.report.jsonkeeps original IDs, diagnostics, results, losses and normalization mappings.- The exact SDK bundles, version/integrity metadata, licenses and Node worker harness reproduce the comparison.
Run outside the browser
node replay.mjsUse Node.js 22 or newer and keep the extracted directory together. No package installation, API key or live endpoint is needed. Each SDK executes in its own Node worker with a time limit. A matching observation message is a regression result for that capture, not a claim of complete application migration.
Redact a capture without fixing the bug by accident.
An event log may contain private conversation text, application state or signed media links. Sharing the full export is not required to show a protocol regression. The hard part is removing sensitive values while preserving the relationship that fails. Work on a copy, keep the original privately and make the redaction deliberate.
A small replacement can change the experiment.
Consider three fictional events: a message starts with messageId: "msg-private-17", a text delta refers to that same ID, and a message-end event closes it. Replace the value consistently with "msg-demo-1" in all three places. Replacing it only in the first event creates a broken relationship that was not present in the captured run.
Now consider {"discount": null} inside application state. Replacing it with an empty object removes the very value a null-handling comparison might need. Use fictional surrounding data while preserving the field name, nesting and value type that define the failure. A string containing the word “null” is not equivalent to the JSON value null.
The AG-UI migration guide distinguishes the compatibility treatment of certain whole optional null fields from application data. Preserve that boundary in a reproduction. Do not recursively remove every null merely to make a fixture pass.
Write a replacement map before making substitutions.
Private relationship Shareable replacement
run-private-29 run-demo-1
thread-private-4 thread-demo-1
msg-private-17 msg-demo-1
Initial state discount=null Keep null and its location
Media URL with access token Replace with an inert example URL;
mark media retrieval untestedThis is a review map, not a search-and-replace program. IDs may also occur inside text or application payloads where the same spelling has a different role. Inspect the fields used by the failing path. Never publish the private-to-public mapping itself when the left-hand column contains real identifiers.
Keep a before-and-after claim narrow.
Run the private local capture and the sanitized copy through the same pinned clients, with matching initial-context shape and the same reviewed plan. Check whether the original diagnostic still appears, whether the same event index fails and whether the relevant final-state difference remains. A new parse error or a changed terminal boundary means the sanitized version is not yet an equivalent demonstration.
If a signed URL or private tool response is essential to the failure, a fully public fixture may not reproduce that part. State that limitation. A placeholder returning nothing cannot demonstrate image rendering, expiry or authorization behavior. The offline replay proves only what its included data and exact SDK bundles actually execute.
Share the sanitized input, exact client versions, observed difference and steps to reproduce. Keep screenshots secondary to those artifacts. The page’s download bundle retains the selected source text, so review its contents before sending the archive to anybody.