diff options
Diffstat (limited to 'src/config/mod.rs')
| -rw-r--r-- | src/config/mod.rs | 52 |
1 files changed, 48 insertions, 4 deletions
diff --git a/src/config/mod.rs b/src/config/mod.rs index 6f99fd6..7673133 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -1039,6 +1039,7 @@ impl Config { } } self.session = session; + self.init_agent_session_variables()?; Ok(()) } @@ -1058,6 +1059,9 @@ impl Config { session.exit(&sessions_dir, self.working_mode.is_repl())?; self.last_message = None; } + if let Some(agent) = self.agent.as_mut() { + agent.set_session_variables(None); + } Ok(()) } @@ -1097,10 +1101,10 @@ impl Config { pub fn empty_session(&mut self) -> Result<()> { if let Some(session) = self.session.as_mut() { - session.clear_messages(); if let Some(agent) = self.agent.as_ref() { - session.set_agent(agent); + session.sync_agent(agent, false); } + session.clear_messages(); } else { bail!("No session") } @@ -1380,6 +1384,8 @@ impl Config { config.write().agent = Some(agent); if let Some(session) = session { config.write().use_session(Some(&session))?; + } else { + config.write().init_agent_shared_variables()?; } Ok(()) } @@ -1408,7 +1414,12 @@ impl Config { let key = parts[0]; let value = parts[1]; match self.agent.as_mut() { - Some(agent) => agent.set_variable(key, value)?, + Some(agent) => { + agent.set_variable(key, value)?; + if let Some(session) = self.session.as_mut() { + session.sync_agent(agent, true); + } + } None => bail!("No agent"), }; Ok(()) @@ -1563,7 +1574,7 @@ impl Config { }, ".variable" => match &self.agent { Some(agent) => agent - .variables() + .defined_variables() .iter() .map(|v| (v.name.clone(), Some(v.description.clone()))) .collect(), @@ -1856,6 +1867,39 @@ impl Config { .with_context(|| "Failed to save message") } + fn init_agent_shared_variables(&mut self) -> Result<()> { + let agent = match self.agent.as_mut() { + Some(v) => v, + None => return Ok(()), + }; + let new_variables = + Agent::init_agent_variables(agent.defined_variables(), agent.config_variables())?; + agent.set_shared_variables(new_variables); + Ok(()) + } + + fn init_agent_session_variables(&mut self) -> Result<()> { + let (agent, session) = match (self.agent.as_mut(), self.session.as_mut()) { + (Some(agent), Some(session)) => (agent, session), + _ => return Ok(()), + }; + let config_variables = agent.config_variables(); + let shared_variables = agent.shared_variables(); + let mut all_variables = if shared_variables.is_empty() { + config_variables.clone() + } else { + shared_variables.clone() + }; + all_variables.extend(session.agent_variables().clone()); + let new_variables = Agent::init_agent_variables(agent.defined_variables(), &all_variables)?; + if shared_variables.is_empty() { + agent.set_shared_variables(new_variables.clone()); + } + agent.set_session_variables(Some(new_variables)); + session.sync_agent(agent, false); + Ok(()) + } + fn open_message_file(&self) -> Result<File> { let path = self.messages_file()?; ensure_parent_exists(&path)?; |
