Skip to content

Commit 0e24da0

Browse files
committed
fix: update antigravity session after conversation switch
1 parent 06a6056 commit 0e24da0

2 files changed

Lines changed: 132 additions & 99 deletions

File tree

src/detect/mod.rs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,10 @@ pub(crate) fn full_lifecycle_hook_authority(source: &str, agent_label: &str) ->
293293
}
294294

295295
pub(crate) fn session_identity_only_integration(source: &str, agent_label: &str) -> bool {
296-
(source, agent_label) == ("herdr:hermes", "hermes")
296+
matches!(
297+
(source, agent_label),
298+
("herdr:hermes", "hermes") | ("herdr:antigravity_cli", "agy")
299+
)
297300
}
298301

299302
// ---------------------------------------------------------------------------
@@ -771,10 +774,15 @@ mod tests {
771774
}
772775

773776
#[test]
774-
fn hermes_session_integration_leaves_state_to_screen_detection() {
775-
assert!(!full_lifecycle_hook_authority("herdr:hermes", "hermes"));
776-
assert!(session_identity_only_integration("herdr:hermes", "hermes"));
777-
assert!(Agent::SCREEN_MANIFEST_AGENTS.contains(&Agent::Hermes));
777+
fn session_identity_integrations_leave_state_to_screen_detection() {
778+
for (source, label, agent) in [
779+
("herdr:hermes", "hermes", Agent::Hermes),
780+
("herdr:antigravity_cli", "agy", Agent::Antigravity),
781+
] {
782+
assert!(!full_lifecycle_hook_authority(source, label));
783+
assert!(session_identity_only_integration(source, label));
784+
assert!(Agent::SCREEN_MANIFEST_AGENTS.contains(&agent));
785+
}
778786
}
779787

780788
#[test]

src/terminal/state.rs

Lines changed: 119 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)