aboutsummaryrefslogtreecommitdiff
path: root/src/persist/snapshot.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/persist/snapshot.rs')
-rw-r--r--src/persist/snapshot.rs55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/persist/snapshot.rs b/src/persist/snapshot.rs
index d7db3e97..3518ef41 100644
--- a/src/persist/snapshot.rs
+++ b/src/persist/snapshot.rs
@@ -108,10 +108,19 @@ pub struct PaneSnapshot {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub agent_session: Option<PaneAgentSessionSnapshot>,
#[serde(default, skip_serializing_if = "Option::is_none")]
+ pub agent_resume: Option<PaneAgentResumeSnapshot>,
+ #[serde(default, skip_serializing_if = "Option::is_none")]
pub launch_argv: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
+pub struct PaneAgentResumeSnapshot {
+ pub source: String,
+ pub agent: String,
+ pub argv: Vec<String>,
+}
+
+#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PaneAgentSessionSnapshot {
pub source: String,
pub agent: String,
@@ -362,6 +371,13 @@ fn capture_tab(
value: session.session_ref.value.clone(),
})
});
+ let agent_resume = terminal
+ .and_then(|terminal| terminal.reported_resume())
+ .map(|resume| PaneAgentResumeSnapshot {
+ source: resume.source.clone(),
+ agent: resume.agent.clone(),
+ argv: resume.argv.clone(),
+ });
panes.insert(
id.raw(),
PaneSnapshot {
@@ -370,6 +386,7 @@ fn capture_tab(
agent_name,
managed_agent_kind,
agent_session,
+ agent_resume,
launch_argv,
},
);
@@ -688,6 +705,7 @@ mod tests {
agent_name: None,
managed_agent_kind: None,
agent_session: None,
+ agent_resume: None,
launch_argv: None,
},
);
@@ -699,6 +717,7 @@ mod tests {
agent_name: None,
managed_agent_kind: None,
agent_session: None,
+ agent_resume: None,
launch_argv: None,
},
);
@@ -1287,6 +1306,40 @@ mod tests {
}
#[test]
+ fn capture_contract_includes_reported_agent_resume() {
+ let mut state = state_with_workspaces(&["one"]);
+ let root = state.workspaces[0].tabs[0].root_pane;
+ state.ensure_test_terminals();
+ let terminal_id = state.workspaces[0].tabs[0].panes[&root]
+ .attached_terminal_id
+ .clone();
+ let terminal = state.terminals.get_mut(&terminal_id).unwrap();
+ terminal.set_hook_authority(
+ "prime-agent".into(),
+ "prime-agent".into(),
+ crate::detect::AgentState::Idle,
+ None,
+ Some(1),
+ );
+ assert!(terminal.record_reported_resume(
+ "prime-agent",
+ "prime-agent",
+ Some(1),
+ vec!["prime-agent".into(), "--resume".into(), "a".into()],
+ ));
+
+ let snapshot = capture_from_state(&state);
+ let resume = snapshot.workspaces[0].tabs[0].panes[&root.raw()]
+ .agent_resume
+ .as_ref()
+ .expect("reported resume should be captured");
+
+ assert_eq!(resume.source, "prime-agent");
+ assert_eq!(resume.agent, "prime-agent");
+ assert_eq!(resume.argv, vec!["prime-agent", "--resume", "a"]);
+ }
+
+ #[test]
fn capture_contract_preserves_restored_agent_session() {
let mut state = state_with_workspaces(&["one"]);
let root = state.workspaces[0].tabs[0].root_pane;
@@ -1350,6 +1403,7 @@ mod tests {
agent_name: None,
managed_agent_kind: None,
agent_session: None,
+ agent_resume: None,
launch_argv: None,
},
);
@@ -1363,6 +1417,7 @@ mod tests {
agent_name: None,
managed_agent_kind: None,
agent_session: None,
+ agent_resume: None,
launch_argv: None,
},
);