@@ -41,7 +41,6 @@ use crate::realtime_conversation::handle_start as handle_realtime_conversation_s
4141use crate :: realtime_conversation:: handle_text as handle_realtime_conversation_text;
4242use crate :: rollout:: session_index;
4343use crate :: stream_events_utils:: HandleOutputCtx ;
44- use crate :: stream_events_utils:: ServerSideCompaction ;
4544use crate :: stream_events_utils:: handle_non_tool_response_item;
4645use crate :: stream_events_utils:: handle_output_item_done;
4746use crate :: stream_events_utils:: last_assistant_message_from_item;
@@ -81,6 +80,7 @@ use codex_protocol::config_types::Settings;
8180use codex_protocol:: config_types:: WebSearchMode ;
8281use codex_protocol:: dynamic_tools:: DynamicToolResponse ;
8382use codex_protocol:: dynamic_tools:: DynamicToolSpec ;
83+ use codex_protocol:: items:: ContextCompactionItem ;
8484use codex_protocol:: items:: PlanItem ;
8585use codex_protocol:: items:: TurnItem ;
8686use codex_protocol:: items:: UserMessageItem ;
@@ -3487,7 +3487,7 @@ impl Session {
34873487 pub ( crate ) async fn record_context_updates_and_set_reference_context_item (
34883488 & self ,
34893489 turn_context : & TurnContext ,
3490- ) -> Vec < ResponseItem > {
3490+ ) {
34913491 let reference_context_item = {
34923492 let state = self . state . lock ( ) . await ;
34933493 state. reference_context_item ( )
@@ -3514,7 +3514,6 @@ impl Session {
35143514 // context items. This keeps later runtime diffing aligned with the current turn state.
35153515 let mut state = self . state . lock ( ) . await ;
35163516 state. set_reference_context_item ( Some ( turn_context_item) ) ;
3517- context_items
35183517 }
35193518
35203519 pub ( crate ) async fn update_token_usage_info (
@@ -5467,12 +5466,8 @@ pub(crate) async fn run_turn(
54675466
54685467 let initial_input_for_turn: ResponseInputItem = ResponseInputItem :: from ( input. clone ( ) ) ;
54695468 let response_item: ResponseItem = initial_input_for_turn. clone ( ) . into ( ) ;
5470- sess. record_user_prompt_and_emit_turn_item (
5471- turn_context. as_ref ( ) ,
5472- & input,
5473- response_item. clone ( ) ,
5474- )
5475- . await ;
5469+ sess. record_user_prompt_and_emit_turn_item ( turn_context. as_ref ( ) , & input, response_item)
5470+ . await ;
54765471 // Track the previous-turn baseline from the regular user-turn path only so
54775472 // standalone tasks (compact/shell/review/undo) cannot suppress future
54785473 // model/realtime injections.
@@ -5567,22 +5562,9 @@ pub(crate) async fn run_turn(
55675562 . await
55685563 {
55695564 Ok ( sampling_request_output) => {
5570- if inline_server_side_compaction_threshold ( & sess, & turn_context) . is_some ( ) {
5571- let result = if sampling_request_output. observed_server_side_compaction {
5572- "applied"
5573- } else {
5574- "skipped"
5575- } ;
5576- sess. services . session_telemetry . counter (
5577- "codex.inline_compaction" ,
5578- 1 ,
5579- & [ ( "result" , result) ] ,
5580- ) ;
5581- }
55825565 let SamplingRequestResult {
55835566 needs_follow_up,
55845567 last_agent_message : sampling_request_last_agent_message,
5585- observed_server_side_compaction : _,
55865568 } = sampling_request_output;
55875569 let total_usage_tokens = sess. get_total_token_usage ( ) . await ;
55885570 let token_limit_reached = total_usage_tokens >= auto_compact_limit;
@@ -5601,19 +5583,18 @@ pub(crate) async fn run_turn(
56015583 ) ;
56025584
56035585 // as long as compaction works well in getting us way below the token limit, we shouldn't worry about being in an infinite loop.
5604- if token_limit_reached && needs_follow_up {
5605- if inline_server_side_compaction_threshold ( & sess, & turn_context) . is_some ( ) {
5606- } else if run_auto_compact (
5586+ if token_limit_reached
5587+ && needs_follow_up
5588+ && inline_server_side_compaction_threshold ( & sess, & turn_context) . is_none ( )
5589+ && run_auto_compact (
56075590 & sess,
56085591 & turn_context,
56095592 InitialContextInjection :: BeforeLastUserMessage ,
56105593 )
56115594 . await
56125595 . is_err ( )
5613- {
5614- return None ;
5615- }
5616- continue ;
5596+ {
5597+ return None ;
56175598 }
56185599
56195600 if !needs_follow_up {
@@ -5723,9 +5704,8 @@ fn inline_server_side_compaction_threshold(
57235704 if !should_use_remote_compact_task ( & turn_context. provider ) {
57245705 return None ;
57255706 }
5726- // OpenAI inline auto-compaction uses Responses `context_management`, which has no
5727- // compaction-prompt field. Auto-compaction therefore ignores `compact_prompt`, while manual
5728- // `/compact` still uses the point-in-time compact endpoint.
5707+ // Inline Responses compaction has no prompt override; manual `/compact` still uses the
5708+ // point-in-time compact endpoint.
57295709 turn_context. model_info . auto_compact_token_limit ( )
57305710}
57315711
@@ -6217,7 +6197,6 @@ async fn built_tools(
62176197struct SamplingRequestResult {
62186198 needs_follow_up : bool ,
62196199 last_agent_message : Option < String > ,
6220- observed_server_side_compaction : bool ,
62216200}
62226201
62236202/// Ephemeral per-response state for streaming a single proposed plan.
@@ -6806,7 +6785,6 @@ async fn try_run_sampling_request(
68066785 FuturesOrdered :: new ( ) ;
68076786 let mut needs_follow_up = false ;
68086787 let mut last_agent_message: Option < String > = None ;
6809- let mut observed_server_side_compaction = false ;
68106788 let mut active_item: Option < TurnItem > = None ;
68116789 let mut should_emit_turn_diff = false ;
68126790 let plan_mode = turn_context. collaboration_mode . mode == ModeKind :: Plan ;
@@ -6850,7 +6828,6 @@ async fn try_run_sampling_request(
68506828 match event {
68516829 ResponseEvent :: Created => { }
68526830 ResponseEvent :: OutputItemDone ( item) => {
6853- let saw_server_side_compaction = matches ! ( item, ResponseItem :: Compaction { .. } ) ;
68546831 let previously_active_item = active_item. take ( ) ;
68556832 if let Some ( previous) = previously_active_item. as_ref ( )
68566833 && matches ! ( previous, TurnItem :: AgentMessage ( _) )
@@ -6879,6 +6856,28 @@ async fn try_run_sampling_request(
68796856 continue ;
68806857 }
68816858
6859+ if matches ! ( item, ResponseItem :: Compaction { .. } ) {
6860+ let turn_item = TurnItem :: ContextCompaction ( match previously_active_item {
6861+ Some ( TurnItem :: ContextCompaction ( item) ) => item,
6862+ _ => ContextCompactionItem :: new ( ) ,
6863+ } ) ;
6864+ debug ! (
6865+ turn_id = %turn_context. sub_id,
6866+ "emitting streamed server-side raw compaction item for immediate local checkpoint apply"
6867+ ) ;
6868+ sess. send_event (
6869+ & turn_context,
6870+ EventMsg :: RawResponseItem ( RawResponseItemEvent { item : item. clone ( ) } ) ,
6871+ )
6872+ . await ;
6873+ sess. apply_server_side_compaction ( turn_context. as_ref ( ) , item)
6874+ . await ;
6875+ sess. emit_turn_item_started ( & turn_context, & turn_item) . await ;
6876+ sess. emit_turn_item_completed ( & turn_context, turn_item)
6877+ . await ;
6878+ continue ;
6879+ }
6880+
68826881 let mut ctx = HandleOutputCtx {
68836882 sess : sess. clone ( ) ,
68846883 turn_context : turn_context. clone ( ) ,
@@ -6889,16 +6888,6 @@ async fn try_run_sampling_request(
68896888 let output_result = handle_output_item_done ( & mut ctx, item, previously_active_item)
68906889 . instrument ( handle_responses)
68916890 . await ?;
6892- observed_server_side_compaction |= saw_server_side_compaction;
6893- if let Some ( ServerSideCompaction { item, turn_item } ) =
6894- output_result. server_side_compaction
6895- {
6896- sess. apply_server_side_compaction ( turn_context. as_ref ( ) , item)
6897- . await ;
6898- sess. emit_turn_item_started ( & turn_context, & turn_item) . await ;
6899- sess. emit_turn_item_completed ( & turn_context, turn_item)
6900- . await ;
6901- }
69026891 if let Some ( tool_future) = output_result. tool_future {
69036892 in_flight. push_back ( tool_future) ;
69046893 }
@@ -6908,14 +6897,13 @@ async fn try_run_sampling_request(
69086897 needs_follow_up |= output_result. needs_follow_up ;
69096898 }
69106899 ResponseEvent :: OutputItemAdded ( item) => {
6900+ if matches ! ( item, ResponseItem :: Compaction { .. } ) {
6901+ continue ;
6902+ }
69116903 if let Some ( turn_item) =
69126904 handle_non_tool_response_item ( & item, plan_mode, Some ( & turn_context. cwd ) ) . await
69136905 {
69146906 let mut turn_item = turn_item;
6915- if matches ! ( turn_item, TurnItem :: ContextCompaction ( _) ) {
6916- active_item = Some ( turn_item) ;
6917- continue ;
6918- }
69196907 let mut seeded_parsed: Option < ParsedAssistantTextDelta > = None ;
69206908 let mut seeded_item_id: Option < String > = None ;
69216909 if matches ! ( turn_item, TurnItem :: AgentMessage ( _) )
@@ -7005,7 +6993,6 @@ async fn try_run_sampling_request(
70056993 break Ok ( SamplingRequestResult {
70066994 needs_follow_up,
70076995 last_agent_message,
7008- observed_server_side_compaction,
70096996 } ) ;
70106997 }
70116998 ResponseEvent :: OutputTextDelta ( delta) => {
0 commit comments