Serve an agent directory's schedules until `cancel` fires. Builds one durable session per enabled schedule (`schedule: `), injecting the agent dir's `prompt_slots`, `skill_dirs`, and `tools/`. `extra` merges into each schedule session's [`SessionOptions`] (model, `llm_client`, `session_store`, …); a host-set `prompt_slots` is honored, but `session_id` is always derived per schedule.
(
agent: &Agent,
agent_dir: &AgentDir,
workspace: impl Into<String> + Clone,
extra: Option<SessionOptions>,
cancel: CancellationToken,
)
| 63 | /// `session_store`, …); a host-set `prompt_slots` is honored, but `session_id` is |
| 64 | /// always derived per schedule. |
| 65 | pub async fn serve_agent_dir( |
| 66 | agent: &Agent, |
| 67 | agent_dir: &AgentDir, |
| 68 | workspace: impl Into<String> + Clone, |
| 69 | extra: Option<SessionOptions>, |
| 70 | cancel: CancellationToken, |
| 71 | ) -> Result<()> { |
| 72 | let extra = extra.unwrap_or_default(); |
| 73 | |
| 74 | let mut sessions = HashMap::new(); |
| 75 | for spec in agent_dir.schedules.iter().filter(|s| s.enabled) { |
| 76 | let session = build_session( |
| 77 | agent, |
| 78 | agent_dir, |
| 79 | format!("schedule:{}", spec.name), |
| 80 | workspace.clone(), |
| 81 | &extra, |
| 82 | ) |
| 83 | .await?; |
| 84 | sessions.insert(spec.name.clone(), Arc::new(session)); |
| 85 | } |
| 86 | |
| 87 | let scheduler = Scheduler::new(agent_dir.schedules.clone())?; |
| 88 | let sink: Arc<dyn ScheduleSink> = Arc::new(SessionScheduleSink { sessions }); |
| 89 | scheduler.run(sink, cancel).await; |
| 90 | Ok(()) |
| 91 | } |
| 92 | |
| 93 | /// Build one durable serve session under the explicit `session_id` |
| 94 | /// (`schedule:<name>`), injecting the agent dir's prompt slots, skills, and |