steer/
lib.rs

1pub mod cli;
2pub mod commands;
3pub mod error;
4pub mod session_config;
5
6// Re-export modules from steer-core
7pub use steer_core::{api, app, config, events, runners, session, tools, utils, workspace};
8
9use eyre::Result;
10use steer_core::api::Model;
11use steer_core::app::Message;
12use steer_core::runners::{OneShotRunner, RunOnceResult};
13use steer_core::session::{SessionManager, SessionToolConfig};
14
15/// Runs the agent once in an existing session.
16///
17/// * `session_manager` – SessionManager instance to use
18/// * `session_id`      – ID of the existing session to use
19/// * `message`         – user message to process
20/// * `timeout`         – optional wall-clock limit
21pub async fn run_once_in_session(
22    session_manager: &SessionManager,
23    session_id: String,
24    message: String,
25) -> Result<RunOnceResult> {
26    OneShotRunner::run_in_session(session_manager, session_id, message)
27        .await
28        .map_err(|e| eyre::eyre!("Failed to run in session: {}", e))
29}
30
31/// Runs the agent once in a new ephemeral session.
32///
33/// * `session_manager` – SessionManager instance to use
34/// * `init_msgs`       – seed conversation (system + user or multi-turn)
35/// * `model`           – which LLM to use
36/// * `tool_config`     – optional tool configuration
37/// * `tool_policy`     – optional tool approval policy
38/// * `timeout`         – optional wall-clock limit
39pub async fn run_once_ephemeral(
40    session_manager: &SessionManager,
41    init_msgs: Vec<Message>,
42    model: Model,
43    tool_config: Option<SessionToolConfig>,
44    tool_policy: Option<steer_core::session::ToolApprovalPolicy>,
45    system_prompt: Option<String>,
46) -> Result<RunOnceResult> {
47    OneShotRunner::run_ephemeral(
48        session_manager,
49        init_msgs,
50        model,
51        tool_config,
52        tool_policy,
53        system_prompt,
54    )
55    .await
56    .map_err(|e| eyre::eyre!("Failed to run ephemeral session: {}", e))
57}
58
59/// Convenience function for simple one-shot runs with default tool configuration.
60/// Creates a temporary SessionManager for this single operation.
61///
62/// * `init_msgs`     – seed conversation (system + user or multi-turn)
63/// * `model`         – which LLM to use
64pub async fn run_once(init_msgs: Vec<Message>, model: Model) -> Result<RunOnceResult> {
65    // Only create temporary session manager for the simple convenience function
66    let session_manager = create_session_manager(model).await?;
67    run_once_ephemeral(&session_manager, init_msgs, model, None, None, None).await
68}
69
70/// Creates a SessionManager for use with the one-shot functions.
71///
72/// This is the recommended way to create a SessionManager for one-shot operations
73/// when you want to reuse it across multiple calls.
74pub async fn create_session_manager(default_model: Model) -> Result<SessionManager> {
75    use steer_core::session::SessionManagerConfig;
76
77    // Use the same session store as normal operation (~/.steer/sessions.db)
78    let store = steer_core::utils::session::create_session_store()
79        .await
80        .map_err(|e| eyre::eyre!("Failed to create session store: {}", e))?;
81
82    let config = SessionManagerConfig {
83        max_concurrent_sessions: 10,
84        default_model,
85        auto_persist: true,
86    };
87
88    Ok(SessionManager::new(store, config))
89}