@@ -1234,7 +1234,7 @@ impl TerminalState {
12341234 && current_kind == crate :: agent_resume:: AgentSessionRefKind :: Id
12351235 && session_ref. kind == crate :: agent_resume:: AgentSessionRefKind :: Id
12361236 && current_value != session_ref. value
1237- && !Self :: session_start_source_allows_session_replacement (
1237+ && !Self :: session_report_allows_session_replacement (
12381238 source,
12391239 agent_label,
12401240 session_start_source,
@@ -1267,7 +1267,7 @@ impl TerminalState {
12671267 } )
12681268 }
12691269
1270- fn session_start_source_allows_session_replacement (
1270+ fn session_report_allows_session_replacement (
12711271 source : & str ,
12721272 agent_label : & str ,
12731273 session_start_source : Option < & str > ,
@@ -1291,6 +1291,7 @@ impl TerminalState {
12911291 "omp" ,
12921292 Some ( "startup" | "new" | "resume" | "fork" )
12931293 )
1294+ | ( "herdr:antigravity_cli" , "agy" , None )
12941295 )
12951296 }
12961297
@@ -1413,12 +1414,12 @@ impl TerminalState {
14131414 if self . known_agent_label_conflicts_with_detected_agent ( & agent_label) {
14141415 return None ;
14151416 }
1416- let session_replacement_allowed = Self :: session_start_source_allows_session_replacement (
1417+ let session_replacement_allowed = Self :: session_report_allows_session_replacement (
14171418 & source,
14181419 & agent_label,
14191420 session_start_source. as_deref ( ) ,
14201421 ) ;
1421- let replacing_hermes_session =
1422+ let replacing_identity_only_session =
14221423 crate :: detect:: session_identity_only_integration ( & source, & agent_label)
14231424 && session_replacement_allowed
14241425 && self . current_session_identity_for_persistence ( ) . is_some_and (
@@ -1430,7 +1431,7 @@ impl TerminalState {
14301431 && current_value != session_ref. value
14311432 } ,
14321433 ) ;
1433- if replacing_hermes_session && !process_present {
1434+ if replacing_identity_only_session && !process_present {
14341435 return None ;
14351436 }
14361437 let owner_conflicts = self . current_session_owner_conflicts ( & source, & agent_label) ;
@@ -2309,101 +2310,125 @@ mod tests {
23092310 }
23102311
23112312 #[ test]
2312- fn hermes_session_claim_leaves_state_to_detection ( ) {
2313- let mut terminal = test_terminal ( ) ;
2314- terminal. set_detected_state ( Some ( Agent :: Hermes ) , AgentState :: Idle ) ;
2315- let session_ref = crate :: agent_resume:: AgentSessionRef :: id ( "hermes-root" ) . unwrap ( ) ;
2316-
2317- let session = terminal. set_agent_session_ref_for_session_start (
2318- "herdr:hermes" . into ( ) ,
2319- "hermes" . into ( ) ,
2320- Some ( session_ref. clone ( ) ) ,
2321- Some ( 10 ) ,
2322- Some ( "startup" . into ( ) ) ,
2323- ) ;
2324-
2325- assert ! ( session. is_some( ) ) ;
2326- assert ! ( terminal. hook_authority. is_none( ) ) ;
2327- assert_eq ! (
2328- terminal
2329- . persisted_agent_session
2330- . as_ref( )
2331- . map( |session| & session. session_ref) ,
2332- Some ( & session_ref)
2333- ) ;
2334-
2335- terminal. set_detected_state ( Some ( Agent :: Hermes ) , AgentState :: Working ) ;
2313+ fn session_identity_claims_leave_state_to_detection ( ) {
2314+ for ( source, label, agent, start_source, replacement_source) in [
2315+ (
2316+ "herdr:hermes" ,
2317+ "hermes" ,
2318+ Agent :: Hermes ,
2319+ Some ( "startup" ) ,
2320+ Some ( "resume" ) ,
2321+ ) ,
2322+ (
2323+ "herdr:antigravity_cli" ,
2324+ "agy" ,
2325+ Agent :: Antigravity ,
2326+ None ,
2327+ None ,
2328+ ) ,
2329+ ] {
2330+ let mut terminal = test_terminal ( ) ;
2331+ terminal. set_detected_state ( Some ( agent) , AgentState :: Idle ) ;
2332+ let first_ref =
2333+ crate :: agent_resume:: AgentSessionRef :: id ( format ! ( "{label}-root" ) ) . unwrap ( ) ;
2334+ let first = terminal. set_agent_session_ref_for_session_start (
2335+ source. into ( ) ,
2336+ label. into ( ) ,
2337+ Some ( first_ref. clone ( ) ) ,
2338+ Some ( 10 ) ,
2339+ start_source. map ( str:: to_string) ,
2340+ ) ;
23362341
2337- assert_eq ! ( terminal. state, AgentState :: Working ) ;
2338- assert ! ( terminal. hook_authority. is_none( ) ) ;
2342+ assert ! ( first. is_some( ) , "{label} should accept its session" ) ;
2343+ assert ! ( terminal. hook_authority. is_none( ) ) ;
2344+ assert_eq ! ( terminal. state, AgentState :: Idle ) ;
2345+ assert_eq ! (
2346+ terminal
2347+ . persisted_agent_session
2348+ . as_ref( )
2349+ . map( |session| & session. session_ref) ,
2350+ Some ( & first_ref)
2351+ ) ;
23392352
2340- let replacement_ref =
2341- crate :: agent_resume:: AgentSessionRef :: id ( "hermes-replacement" ) . unwrap ( ) ;
2342- let replacement = terminal. set_agent_session_ref_for_session_start (
2343- "herdr:hermes" . into ( ) ,
2344- "hermes" . into ( ) ,
2345- Some ( replacement_ref. clone ( ) ) ,
2346- Some ( 11 ) ,
2347- Some ( "startup" . into ( ) ) ,
2348- ) ;
2353+ terminal. set_detected_state ( Some ( agent) , AgentState :: Working ) ;
2354+ let replacement_ref =
2355+ crate :: agent_resume:: AgentSessionRef :: id ( format ! ( "{label}-replacement" ) ) . unwrap ( ) ;
2356+ let replacement = terminal. set_agent_session_ref_for_session_start (
2357+ source. into ( ) ,
2358+ label. into ( ) ,
2359+ Some ( replacement_ref. clone ( ) ) ,
2360+ Some ( 11 ) ,
2361+ start_source. map ( str:: to_string) ,
2362+ ) ;
23492363
2350- assert ! ( replacement. is_some( ) ) ;
2351- assert_eq ! ( terminal. state, AgentState :: Working ) ;
2352- assert ! ( terminal. hook_authority. is_none( ) ) ;
2353- assert_eq ! (
2354- terminal
2355- . persisted_agent_session
2356- . as_ref( )
2357- . map( |session| & session. session_ref) ,
2358- Some ( & replacement_ref)
2359- ) ;
2364+ assert ! (
2365+ replacement. is_some_and( |mutation| mutation. session_ref_changed) ,
2366+ "{label} should replace its detected session"
2367+ ) ;
2368+ assert ! ( terminal. hook_authority. is_none( ) ) ;
2369+ assert_eq ! ( terminal. state, AgentState :: Working ) ;
2370+ assert_eq ! (
2371+ terminal
2372+ . persisted_agent_session
2373+ . as_ref( )
2374+ . map( |session| & session. session_ref) ,
2375+ Some ( & replacement_ref)
2376+ ) ;
23602377
2361- let legacy_state = terminal. set_hook_authority_with_session_ref (
2362- "herdr:hermes" . into ( ) ,
2363- "hermes" . into ( ) ,
2364- AgentState :: Blocked ,
2365- None ,
2366- Some ( replacement_ref. clone ( ) ) ,
2367- Some ( 12 ) ,
2368- ) ;
2369- assert ! ( legacy_state. is_none( ) ) ;
2370- assert_eq ! ( terminal. state , AgentState :: Working ) ;
2371- assert ! ( terminal. hook_authority . is_none ( ) ) ;
2378+ let legacy_state = terminal. set_hook_authority_with_session_ref (
2379+ source . into ( ) ,
2380+ label . into ( ) ,
2381+ AgentState :: Blocked ,
2382+ None ,
2383+ Some ( replacement_ref. clone ( ) ) ,
2384+ Some ( 12 ) ,
2385+ ) ;
2386+ assert ! ( legacy_state. is_none( ) ) ;
2387+ assert ! ( terminal. hook_authority . is_none ( ) ) ;
2388+ assert_eq ! ( terminal. state , AgentState :: Working ) ;
23722389
2373- terminal. set_detected_state ( None , AgentState :: Unknown ) ;
2374- let background_replacement = terminal. set_agent_session_ref_for_session_start (
2375- "herdr:hermes" . into ( ) ,
2376- "hermes" . into ( ) ,
2377- crate :: agent_resume:: AgentSessionRef :: id ( "hermes-background" ) ,
2378- Some ( 13 ) ,
2379- Some ( "resume" . into ( ) ) ,
2380- ) ;
2381- assert ! ( background_replacement. is_none( ) ) ;
2382- assert_eq ! (
2383- terminal
2384- . persisted_agent_session
2385- . as_ref( )
2386- . map( |session| & session. session_ref) ,
2387- Some ( & replacement_ref)
2388- ) ;
2390+ terminal. set_detected_state ( None , AgentState :: Unknown ) ;
2391+ let background_ref =
2392+ crate :: agent_resume:: AgentSessionRef :: id ( format ! ( "{label}-background" ) ) . unwrap ( ) ;
2393+ let background_replacement = terminal. set_agent_session_ref_for_session_start (
2394+ source. into ( ) ,
2395+ label. into ( ) ,
2396+ Some ( background_ref. clone ( ) ) ,
2397+ Some ( 13 ) ,
2398+ replacement_source. map ( str:: to_string) ,
2399+ ) ;
2400+ assert ! (
2401+ background_replacement. is_none( ) ,
2402+ "{label} should reject a background replacement"
2403+ ) ;
2404+ assert_eq ! (
2405+ terminal
2406+ . persisted_agent_session
2407+ . as_ref( )
2408+ . map( |session| & session. session_ref) ,
2409+ Some ( & replacement_ref)
2410+ ) ;
23892411
2390- terminal. set_detected_state ( Some ( Agent :: Hermes ) , AgentState :: Idle ) ;
2391- let retried_ref = crate :: agent_resume:: AgentSessionRef :: id ( "hermes-background" ) . unwrap ( ) ;
2392- let retried_replacement = terminal. set_agent_session_ref_for_session_start (
2393- "herdr:hermes" . into ( ) ,
2394- "hermes" . into ( ) ,
2395- Some ( retried_ref. clone ( ) ) ,
2396- Some ( 14 ) ,
2397- Some ( "resume" . into ( ) ) ,
2398- ) ;
2399- assert ! ( retried_replacement. is_some( ) ) ;
2400- assert_eq ! (
2401- terminal
2402- . persisted_agent_session
2403- . as_ref( )
2404- . map( |session| & session. session_ref) ,
2405- Some ( & retried_ref)
2406- ) ;
2412+ terminal. set_detected_state ( Some ( agent) , AgentState :: Idle ) ;
2413+ let retried_replacement = terminal. set_agent_session_ref_for_session_start (
2414+ source. into ( ) ,
2415+ label. into ( ) ,
2416+ Some ( background_ref. clone ( ) ) ,
2417+ Some ( 14 ) ,
2418+ replacement_source. map ( str:: to_string) ,
2419+ ) ;
2420+ assert ! (
2421+ retried_replacement. is_some_and( |mutation| mutation. session_ref_changed) ,
2422+ "{label} should replace the session once detected"
2423+ ) ;
2424+ assert_eq ! (
2425+ terminal
2426+ . persisted_agent_session
2427+ . as_ref( )
2428+ . map( |session| & session. session_ref) ,
2429+ Some ( & background_ref)
2430+ ) ;
2431+ }
24072432 }
24082433
24092434 #[ test]
0 commit comments