Follow Discord
Sweep 22 Sep 2026 · 17:19Z Build v2.1.280 501 read Stable v2.1.267 Latest v2.1.280 Next v2.1.280 Feeds RSS JSON llms.txt Unofficial
Claude Code v2.1.269 ·

Plugin hooks can now stream results as async generators

Plugin hooks can be written as async generators that stream chunks, with the first use letting a hook override the model per request

TierNothing to try yethow much it should matter to you
Useful5my rating, 1 to 5
Signal4worth watching, 1 to 5
AreaPlugin Hookswhat it touches
KindNew Featuresin v2.1.269,
Group of 5 Nothing to try yet Notable No documentation found

Plugin hooks can be written as async generators that stream chunks, with the first use letting a hook override the model per request

What

  • Hooks can now be implemented as async generator functions (async function*) that yield a stream of chunks instead of returning one final value. Claude Code validates this: hooks registered on events designated as "streaming" events must be async generators, and hooks on non-streaming events must not be.
  • A full streaming dispatch pipeline was added end-to-end: the plugin host gained dispatchStream/linkStreams/withinSteps alongside the existing dispatch/link/within, the hooks-worker protocol gained matching frame types (dispatch_stream, stream_pull, stream_step, next_pull, next_close, stream_close), and the sandboxed tool/environment worker gained its own dispatch_stream/stream_pull/stream_close messages backed by a streams map, so a dispatch can yield incremental results.
  • Currently only one event, turn.step, is enabled to use the streaming/generator form. It reconstructs each model request/response as discrete stream chunks and lets a registered plugin hook change which model a request uses. If a hook proposes a model that policy doesn't allow, Claude Code keeps the original model and logs a warning plus a hook-effect telemetry event.

Why This lays the groundwork for hooks that need to see or influence a request incrementally rather than only before or after it completes; today that's used to let a plugin hook override or veto the model used for a turn, subject to policy.

Read from
Names in the bundleturn.step

See this entry in the whole of v2.1.269 →

Feedback