Persist explicit user goal edits in model history (#49598)

## Why

User goal edits and clears need to reach the model as user instructions, including when a thread is unloaded or history is being compacted. Automatic goal lifecycle updates must not supply user authorization.

## What changed

- Add optional `origin` values of `user` and `automatic` to `thread/goal/set` and `thread/goal/clear`, and mark TUI goal requests as user actions. Omitted origins do not supply user authorization.
- Persist explicit user objective, status, and clear instructions before changing goal state. Recording failures leave goal state unchanged.
- Coordinate goal edits with thread resume, reload stored history under writer ownership, and preserve edits accepted after the compaction input snapshot.
- Update generated protocol schemas and TypeScript and Python bindings.

## Testing

Add coverage for user edits and clears on loaded and unloaded threads, concurrent path-based resume, exclusion of automatic goals from user instructions, preservation of edits during compaction, and recording failures that leave goal state unchanged.

GitOrigin-RevId: d779d7c678a0c32a6ef76975dbe5b1400d1df245
This commit is contained in:
felixxia-oai
2026-09-30 11:58:03 +00:00
committed by copyberry
parent 1fc8d54807
commit de02016798
35 changed files with 698 additions and 109 deletions
+1 -2
View File
@@ -755,8 +755,7 @@ impl CodexThread {
&self,
update: crate::context::UserGoalUpdate,
) -> CodexResult<()> {
self.session.record_user_goal_update(update).await;
self.checkpoint_preparation().await?;
self.session.record_user_goal_update(update).await?;
Ok(())
}