Add plumbing to approve stored Auto-Review denials (#18955)

## Summary

This adds the structural plumbing needed for an app-server client to
approve a previously denied Guardian review and carry that approval
context into the next model turn.

This PR does not add the actual `/auto-review-denials` tool 

## What Changed

- Added app-server v2 RPC `thread/approveGuardianDeniedAction`.
- Added generated JSON schema and TypeScript fixtures for
`ThreadApproveGuardianDeniedAction*`.
- Added core `Op::ApproveGuardianDeniedAction`.
- Added a core handler that validates the event is a denied Guardian
assessment and injects a developer message containing the stored denial
event JSON.
- Queues the approval context for the next turn if there is no active
turn yet.
- Added the TUI app-server bridge so `Op::ApproveGuardianDeniedAction {
event }` is routed to the app-server request.

## What This Does Not Do

- Does not add `/auto-review-denials`.
- Does not add chat widget recent-denial state.
- Does not add popup/list UI.
- Does not add a product-facing denial lookup/store.
- Does not change where Guardian denials are originally emitted or
persisted.

## Verification

- `cargo test -p codex-tui thread_approve_guardian_denied_action`
This commit is contained in:
Won Park
2026-04-22 10:38:19 -07:00
committed by GitHub
parent 78593d72ea
commit 11e5af53c4
17 changed files with 328 additions and 2 deletions

View File

@@ -672,6 +672,12 @@ impl App {
Ok(true)
}
AppCommandView::OverrideTurnContext { .. } => Ok(true),
AppCommandView::Other(Op::ApproveGuardianDeniedAction { event }) => {
app_server
.thread_approve_guardian_denied_action(thread_id, event)
.await?;
Ok(true)
}
_ => Ok(false),
}
}