Treat inference hook denials as terminal errors (#60511)

## Why

An explicit denial from a workspace inference hook should stop the request, including retries and compaction model fallback.

## What changed

Recognize `inference_hook_denied` provider errors and preserve the provider's message, with a fallback when none is supplied. Expose the distinct `inferenceHookDenied` error through the app-server protocol and generated schemas and SDK types. Treat the denial as non-retryable during turns, compaction, and guardian review.

## Testing

Add coverage for terminal denials over HTTP, SSE, and WebSocket, error serialization and persistence in `thread/read`, and compaction failures that preserve token usage and history without retrying or falling back to another model.

GitOrigin-RevId: 2ebd480f01e52f4e6bd3db8a0f92d5814d18ccb1
This commit is contained in:
ccui-oai
2026-11-10 03:21:26 +00:00
committed by copyberry
parent 1099fe0694
commit 0811df3976
43 changed files with 292 additions and 51 deletions
+3
View File
@@ -2534,6 +2534,9 @@ fn websocket_error_detail(err: &ApiError) -> String {
"handshake error: model not found: [redacted]".to_string()
}
ApiError::InvalidPrompt { .. } => "handshake error: invalid prompt: [redacted]".to_string(),
ApiError::InferenceHookDenied { .. } => {
"handshake error: inference hook denied: [redacted]".to_string()
}
ApiError::ContentPolicyViolation { .. } => {
"handshake error: content policy violation".to_string()
}