Stop TUI chats on misalignment policy violations (#39261)

## Why

When the app server reports a misalignment policy violation, the TUI must stop the affected chat rather than allow more work to continue in it.

## What changed

- Finalize the active turn, clear queued and draft input, disable the composer, and reject further operations and interactive requests for the stopped chat.
- Interrupt an active side conversation when its parent reports the violation, and prevent queued turns, forks, approvals, or goal resumption from restarting work.
- Show a non-dismissible precaution view that directs users to start a new chat or resume another one, with agent command center navigation for remote sessions.

## Testing

Added coverage for stopped-chat behavior, parent/side-thread handling, blocked goal resumption, navigation actions, and narrow and remote-session rendering.

GitOrigin-RevId: 0268c46a19294a17765ea4099f389f15ffaaf030
This commit is contained in:
Eric Traut authored and copyberry committed 2026-08-18 18:50:58 +00:00
1 parent 3006151ad4
commit 785ecd7452
16 files changed
+452 -3

No files matched your search

+5
View File
@@ -364,6 +364,7 @@ use self::interrupts::InterruptManager;
mod keymap_picker;
mod mcp_startup;
use self::mcp_startup::McpStartupStatus;
mod misalignment_policy;
mod pets;
mod session_flow;
mod session_header;
@@ -674,6 +675,7 @@ pub(crate) struct ChatWidget {
thread_rename_block_message: Option<String>,
active_side_conversation: bool,
blocks_direct_input: bool,
misalignment_policy_violation: bool,
normal_placeholder_text: String,
side_placeholder_text: String,
forked_from: Option<ThreadId>,
@@ -1790,6 +1792,9 @@ impl ChatWidget {
T: Into<AppCommand>,
{
let op: AppCommand = op.into();
if self.rejects_misalignment_policy_op(&op) {
return false;
}
if self.blocks_direct_input
&& matches!(
&op,