Support compact SessionStart hooks (#21272)

# Why

Compaction replaces the live conversation history, so hooks that use
`SessionStart` to re-inject durable model context need a way to run
again after that rewrite.

Related - #19905 adds dedicated compact lifecycle hooks

# What

- add `compact` as a supported `SessionStart` source and matcher value
- change pending `SessionStart` state from a single slot to a small FIFO
queue so `resume` / `startup` / `clear` can be preserved alongside a
later `compact`
- drain all queued `SessionStart` sources before the next model request,
preserving their original order

# Testing

The new integration coverage verifies both the basic `compact` matcher
path and the stacked `resume` -> `compact` case where both hooks
contribute `additionalContext` to the next model turn.
This commit is contained in:
Abhinav
2026-05-20 20:46:19 +00:00
committed by GitHub
parent 9265701b7f
commit af49d38373
8 changed files with 476 additions and 55 deletions
@@ -24,6 +24,7 @@ pub enum SessionStartSource {
Startup,
Resume,
Clear,
Compact,
}
impl SessionStartSource {
@@ -32,6 +33,7 @@ impl SessionStartSource {
Self::Startup => "startup",
Self::Resume => "resume",
Self::Clear => "clear",
Self::Compact => "compact",
}
}
}
+1 -1
View File
@@ -673,7 +673,7 @@ fn permission_mode_schema(_gen: &mut SchemaGenerator) -> Schema {
}
fn session_start_source_schema(_gen: &mut SchemaGenerator) -> Schema {
string_enum_schema(&["startup", "resume", "clear"])
string_enum_schema(&["startup", "resume", "clear", "compact"])
}
fn compaction_trigger_schema(_gen: &mut SchemaGenerator) -> Schema {