diff --git a/desktop/src-tauri/src/managed_agents/runtime.rs b/desktop/src-tauri/src/managed_agents/runtime.rs index 770618fdb..a644adb86 100644 --- a/desktop/src-tauri/src/managed_agents/runtime.rs +++ b/desktop/src-tauri/src/managed_agents/runtime.rs @@ -609,25 +609,20 @@ pub fn spawn_agent_child( command.env("SPROUT_ACP_PERSONA_NAME", persona_name); } - // Resolve system prompt and model: prefer the persona definition (if a - // persona pack is configured and the persona matched), otherwise fall back - // to the record-level overrides. - let has_persona_pack = - record.persona_pack_path.is_some() && record.persona_name_in_pack.is_some(); - let persona_prompt_and_model: Option<(String, Option)> = has_persona_pack - .then(|| { - record - .persona_id - .as_deref() - .and_then(|pid| { - super::load_personas(app) - .ok()? - .into_iter() - .find(|p| p.id == pid) - }) - .map(|p| (p.system_prompt, p.model)) + // Resolve system prompt and model: when a persona_id is set, always + // re-read the PersonaRecord at spawn time so edits take effect without + // deleting and recreating the agent. Fall back to the record-level + // snapshot only when no persona is linked or the persona can't be found. + let persona_prompt_and_model: Option<(String, Option)> = record + .persona_id + .as_deref() + .and_then(|pid| { + super::load_personas(app) + .ok()? + .into_iter() + .find(|p| p.id == pid) }) - .flatten(); + .map(|p| (p.system_prompt, p.model)); let (effective_prompt, effective_model) = match persona_prompt_and_model { Some((prompt, model)) => (Some(prompt), model),