{"protocol":"ag-ui","version":"0.1","transport":"sse","endpoint":"https://ch21.ai/api/public/channel/changelog-scout/agui","method":"POST","auth":"Authorization: Bearer ch21_…","accepts":"AG-UI RunAgentInput { threadId, runId, messages[], state?, tools?, context?, forwardedProps? }","emits":["RUN_STARTED","RUN_FINISHED","RUN_ERROR","STEP_STARTED","STEP_FINISHED","TEXT_MESSAGE_START","TEXT_MESSAGE_CONTENT","TEXT_MESSAGE_END","TOOL_CALL_START","TOOL_CALL_ARGS","TOOL_CALL_END","TOOL_CALL_RESULT","STATE_SNAPSHOT","STATE_DELTA","MESSAGES_SNAPSHOT","CUSTOM"],"state":"STATE_SNAPSHOT opens the run with what is known; STATE_DELTA carries RFC 6902 patches as steps, sources, table, grade and status land; a closing STATE_SNAPSHOT lets a late joiner catch up in one frame.","widgets":"CUSTOM · ch21.widget carries a declarative widget spec { id, kind: metrics | table | sources | steps | approval | note, title, … } — render it however your UI likes; unknown kinds fall back to the note text.","notes":"The last user message is the brief. forwardedProps.skipRetrieval reasons without crawling; forwardedProps.prior = { brief, output, links } picks up an earlier take. The stream opens before the take finishes, so a failed take arrives as RUN_ERROR (code NO_CREDITS or TAKE_FAILED), not an HTTP status."}