You'll noticeTier: how much it should matter to you
3Useful: my rating, 1 to 5
0Signal: worth watching, 1 to 5
SDKArea: what it touches
New FeaturesKind: in v2.1.223,
What probably matters to youSection of the release
What
The control-protocol session can now push a system message to the SDK stream whenever a tool call is denied, so clients can react to denials instead of inferring them from the tool result.
Details
New emitPermissionDenied method on the control-protocol session class enqueues a message with type: "system" and subtype: "permission_denied".
Payload carries tool_name, tool_use_id, agent_id, decision_reason_type, a serialized decision_reason, the deny message, a uuid and the session id.
On the stdio createCanUseTool path it fires on any deny.
On the non-stdio path it fires only when a new helper confirms the tool_use id actually appears in the message content and the abort signal has not fired.
Evidence
decision_reason_type
Strings lifted out of the shipped bundle, so the claim above can be checked against them.