#[allow(unused)]
pub(crate) mod cmd_mate;
#[doc(hidden)]
pub mod cm_agent;
#[doc(hidden)]
pub mod cm_llm;
#[allow(unused)]
pub(crate) mod cm_runtime;
#[doc(hidden)]
pub mod cm_config;
#[allow(unused)]
pub(crate) mod cm_tools;
#[allow(unused)]
pub(crate) mod cm_memory;
#[doc(hidden)]
pub mod cm_workflow;
#[allow(unused)]
pub(crate) mod cm_approval;
#[cfg(feature = "web")]
#[allow(unused)]
pub(crate) mod cm_web_host;
#[allow(unused)]
pub(crate) mod cm_mcp;
#[allow(unused)]
pub(crate) mod cm_benchmark;
#[doc(hidden)]
#[allow(unused_imports)]
pub mod cm_internal;
pub mod agent;
pub use crate::cm_internal::tool_sandbox;
pub(crate) use crate::cm_internal::{
agent_errors, agent_role_turn, agent_turn_prep, clarification_questionnaire,
clarification_questionnaire_body_if_tool_ok, context_bootstrap, github_token, health, mcp,
memory, memory_tool_hosts, observability, process_handles, read_file_turn_cache,
readonly_tool_ttl_cache, redact, request_chrome_trace, session_mode_turn, text_encoding,
text_util, tool_call_explain, tool_registry, tool_result, tool_stats, tools,
user_message_file_refs, web_static_dir, workspace,
};
#[cfg(feature = "web")]
mod chat_job_queue;
mod cli_run;
#[doc(hidden)]
pub mod e2e_scenario;
pub use crate::cm_config as config;
pub use crate::cm_sse_protocol::sse;
pub use crate::cm_types as types;
#[cfg(feature = "web")]
mod conversation_store;
pub use crate::cm_llm::http_client;
pub mod llm;
mod meta_dialogue;
mod per_turn_flight;
pub use process_handles::ProcessHandles;
pub use process_handles::TurnProcessHandles;
mod request_audit;
mod shutdown;
#[cfg(test)]
pub fn reset_process_tool_globals_for_tests() {
crate::tools::reset_process_tool_globals_for_tests();
crate::turn_replay_dump::reset_turn_replay_globals_for_tests();
}
mod run_agent_turn;
mod runtime;
#[cfg(feature = "web")]
#[doc(hidden)]
pub mod test_serve;
mod turn_replay_dump;
mod turn_runner;
pub use crate::cm_agent::text_sanitize;
mod user_data;
#[cfg(feature = "web")]
mod web;
pub use per_turn_flight::PerTurnFlight;
pub use request_audit::WebRequestAudit;
pub use config::cli::{
E2eCliArgs, ExtraCliCommand, ParsedCliArgs, SaveSessionFormat, ToolReplayCli, WebBearerCli,
normalize_legacy_argv, parse_args, parse_args_from_argv, root_clap_command_for_man_page,
};
pub use read_file_turn_cache::{ReadFileTurnCache, ReadFileTurnCacheHandle, new_turn_cache_handle};
pub use run_agent_turn::run_agent_turn;
use std::collections::HashSet;
use std::sync::Arc;
use tokio::sync::mpsc;
#[allow(unused_imports)] pub(crate) use turn_runner::{DefaultTurnRunner, TurnRunner, default_turn_runner};
pub struct AgentTurnTransport<'a> {
pub out: Option<&'a mpsc::Sender<String>>,
pub no_stream: bool,
pub cancel: Option<std::sync::Arc<std::sync::atomic::AtomicBool>>,
pub per_flight: Option<std::sync::Arc<PerTurnFlight>>,
pub web_tool_ctx: Option<&'a tool_registry::WebToolRuntime>,
pub sse_control_mirror: Option<crate::sse::SseControlMirror>,
pub llm_backend: Option<&'a (dyn llm::ChatCompletionsBackend + 'static)>,
pub trace_sink: Option<std::sync::Arc<dyn crate::llm::TraceSink>>,
}
pub struct AgentTurnLlmOverrides {
pub temperature_override: Option<f32>,
pub model_override: Option<String>,
pub use_executor_model: bool,
pub executor_model_override: Option<String>,
pub executor_api_base: Option<String>,
pub executor_api_key: Option<String>,
pub seed_override: types::LlmSeedOverride,
}
pub struct RunAgentTurnSharedInputs<'a> {
pub client: &'a reqwest::Client,
pub api_key: &'a str,
pub cfg: &'a Arc<config::AgentConfig>,
pub tools: &'a [crate::types::Tool],
}
pub struct RunAgentTurnSession<'a> {
pub messages: &'a mut Vec<types::Message>,
pub effective_working_dir: &'a std::path::Path,
pub workspace_is_set: bool,
}
pub struct RunAgentTurnAttach {
pub long_term_memory:
Option<std::sync::Arc<crate::memory::long_term_memory::LongTermMemoryRuntime>>,
pub long_term_memory_scope_id: Option<String>,
pub read_file_turn_cache: Option<std::sync::Arc<ReadFileTurnCache>>,
pub turn_allowed_tool_names: Option<Arc<HashSet<String>>>,
pub session_mode: types::SessionMode,
}
pub struct RunAgentTurnObs {
pub tracing_chat_turn: Option<Arc<observability::TracingChatTurn>>,
pub request_audit: Option<Arc<WebRequestAudit>>,
pub process_handles: Arc<crate::process_handles::TurnProcessHandles>,
}
pub struct RunAgentTurnParams<'a> {
pub shared: RunAgentTurnSharedInputs<'a>,
pub session: RunAgentTurnSession<'a>,
pub transport: AgentTurnTransport<'a>,
pub llm: AgentTurnLlmOverrides,
pub attach: RunAgentTurnAttach,
pub obs: RunAgentTurnObs,
}
#[cfg(feature = "web")]
pub struct WebChatStreamBuildArgs<'a> {
pub shared: RunAgentTurnSharedInputs<'a>,
pub messages: &'a mut Vec<types::Message>,
pub effective_working_dir: &'a std::path::Path,
pub workspace_is_set: bool,
pub cancel: std::sync::Arc<std::sync::atomic::AtomicBool>,
pub per_flight: std::sync::Arc<PerTurnFlight>,
pub web_tool_ctx: Option<&'a tool_registry::WebToolRuntime>,
pub temperature_override: Option<f32>,
pub model_override: Option<String>,
pub use_executor_model: bool,
pub executor_model_override: Option<String>,
pub executor_api_base: Option<String>,
pub executor_api_key: Option<String>,
pub seed_override: types::LlmSeedOverride,
pub long_term_memory:
Option<std::sync::Arc<crate::memory::long_term_memory::LongTermMemoryRuntime>>,
pub job_id: u64,
pub conversation_id: &'a str,
pub request_id: Option<String>,
pub out: &'a mpsc::Sender<String>,
pub turn_allowed_tool_names: Option<Arc<HashSet<String>>>,
pub request_audit: Arc<WebRequestAudit>,
pub process_handles: Arc<crate::process_handles::TurnProcessHandles>,
pub session_mode: types::SessionMode,
}
#[cfg(feature = "web")]
pub struct WebChatJsonBuildArgs<'a> {
pub shared: RunAgentTurnSharedInputs<'a>,
pub messages: &'a mut Vec<types::Message>,
pub effective_working_dir: &'a std::path::Path,
pub workspace_is_set: bool,
pub per_flight: std::sync::Arc<PerTurnFlight>,
pub temperature_override: Option<f32>,
pub model_override: Option<String>,
pub use_executor_model: bool,
pub executor_model_override: Option<String>,
pub executor_api_base: Option<String>,
pub executor_api_key: Option<String>,
pub seed_override: types::LlmSeedOverride,
pub long_term_memory:
Option<std::sync::Arc<crate::memory::long_term_memory::LongTermMemoryRuntime>>,
pub job_id: u64,
pub conversation_id: &'a str,
pub request_id: Option<String>,
pub turn_allowed_tool_names: Option<Arc<HashSet<String>>>,
pub request_audit: Arc<WebRequestAudit>,
pub process_handles: Arc<crate::process_handles::TurnProcessHandles>,
pub session_mode: types::SessionMode,
}
#[cfg(feature = "web")]
struct WebChatJobCommonParts<'a> {
shared: RunAgentTurnSharedInputs<'a>,
messages: &'a mut Vec<types::Message>,
effective_working_dir: &'a std::path::Path,
workspace_is_set: bool,
transport: AgentTurnTransport<'a>,
llm: AgentTurnLlmOverrides,
long_term_memory:
Option<std::sync::Arc<crate::memory::long_term_memory::LongTermMemoryRuntime>>,
conversation_id: &'a str,
turn_allowed_tool_names: Option<Arc<HashSet<String>>>,
session_mode: types::SessionMode,
tracing_chat_turn: Arc<observability::TracingChatTurn>,
request_audit: Arc<WebRequestAudit>,
process_handles: Arc<crate::process_handles::TurnProcessHandles>,
}
impl<'a> RunAgentTurnParams<'a> {
#[cfg(feature = "web")]
fn from_web_job_common(parts: WebChatJobCommonParts<'a>) -> Self {
let WebChatJobCommonParts {
shared,
messages,
effective_working_dir,
workspace_is_set,
transport,
llm,
long_term_memory,
conversation_id,
turn_allowed_tool_names,
session_mode,
tracing_chat_turn,
request_audit,
process_handles,
} = parts;
Self {
shared,
session: RunAgentTurnSession {
messages,
effective_working_dir,
workspace_is_set,
},
transport,
llm,
attach: RunAgentTurnAttach {
long_term_memory,
long_term_memory_scope_id: Some(conversation_id.to_string()),
read_file_turn_cache: None,
turn_allowed_tool_names,
session_mode,
},
obs: RunAgentTurnObs {
tracing_chat_turn: Some(tracing_chat_turn),
request_audit: Some(request_audit),
process_handles,
},
}
}
#[cfg(feature = "web")]
pub fn web_chat_stream(args: WebChatStreamBuildArgs<'a>) -> Self {
let WebChatStreamBuildArgs {
shared,
messages,
effective_working_dir,
workspace_is_set,
cancel,
per_flight,
web_tool_ctx,
temperature_override,
model_override,
use_executor_model,
executor_model_override,
executor_api_base,
executor_api_key,
seed_override,
long_term_memory,
job_id,
conversation_id,
out,
turn_allowed_tool_names,
request_audit,
process_handles,
session_mode,
request_id,
} = args;
Self::from_web_job_common(WebChatJobCommonParts {
shared,
messages,
effective_working_dir,
workspace_is_set,
transport: AgentTurnTransport {
out: Some(out),
no_stream: false,
cancel: Some(cancel),
per_flight: Some(per_flight),
web_tool_ctx,
sse_control_mirror: None,
llm_backend: None,
trace_sink: None,
},
llm: AgentTurnLlmOverrides {
temperature_override,
model_override,
use_executor_model,
executor_model_override,
executor_api_base,
executor_api_key,
seed_override,
},
long_term_memory,
conversation_id,
turn_allowed_tool_names,
session_mode,
tracing_chat_turn: observability::TracingChatTurn::new(
job_id,
conversation_id,
request_id,
),
request_audit,
process_handles,
})
}
#[cfg(feature = "web")]
pub fn web_chat_json(args: WebChatJsonBuildArgs<'a>) -> Self {
let WebChatJsonBuildArgs {
shared,
messages,
effective_working_dir,
workspace_is_set,
per_flight,
temperature_override,
model_override,
use_executor_model,
executor_model_override,
executor_api_base,
executor_api_key,
seed_override,
long_term_memory,
job_id,
conversation_id,
turn_allowed_tool_names,
request_audit,
process_handles,
session_mode,
request_id,
} = args;
Self::from_web_job_common(WebChatJobCommonParts {
shared,
messages,
effective_working_dir,
workspace_is_set,
transport: AgentTurnTransport {
out: None,
no_stream: false,
cancel: None,
per_flight: Some(per_flight),
web_tool_ctx: None,
sse_control_mirror: None,
llm_backend: None,
trace_sink: None,
},
llm: AgentTurnLlmOverrides {
temperature_override,
model_override,
use_executor_model,
executor_model_override,
executor_api_base,
executor_api_key,
seed_override,
},
long_term_memory,
conversation_id,
turn_allowed_tool_names,
session_mode,
tracing_chat_turn: observability::TracingChatTurn::new(
job_id,
conversation_id,
request_id,
),
request_audit,
process_handles,
})
}
pub fn benchmark_batch(
client: &'a reqwest::Client,
api_key: &'a str,
cfg: &'a Arc<config::AgentConfig>,
tools: &'a [crate::types::Tool],
messages: &'a mut Vec<types::Message>,
effective_working_dir: &'a std::path::Path,
cancel: std::sync::Arc<std::sync::atomic::AtomicBool>,
) -> Self {
Self {
shared: RunAgentTurnSharedInputs {
client,
api_key,
cfg,
tools,
},
session: RunAgentTurnSession {
messages,
effective_working_dir,
workspace_is_set: true,
},
transport: AgentTurnTransport {
out: None,
no_stream: true,
cancel: Some(cancel),
per_flight: None,
web_tool_ctx: None,
sse_control_mirror: None,
llm_backend: None,
trace_sink: None,
},
llm: AgentTurnLlmOverrides {
temperature_override: None,
model_override: None,
use_executor_model: false,
executor_model_override: None,
executor_api_base: None,
executor_api_key: None,
seed_override: types::LlmSeedOverride::default(),
},
attach: RunAgentTurnAttach {
long_term_memory: None,
long_term_memory_scope_id: None,
read_file_turn_cache: None,
turn_allowed_tool_names: None,
session_mode: types::SessionMode::Act,
},
obs: RunAgentTurnObs {
tracing_chat_turn: None,
request_audit: None,
process_handles: crate::process_handles::TurnProcessHandles::default_arc(),
},
}
}
}
#[cfg(feature = "web")]
pub(crate) use conversation_store::SaveConversationOutcome;
#[cfg(feature = "web")]
pub(crate) use web::AppState;
#[cfg(feature = "web")]
pub(crate) use web::conversation_conflict_sse_line;
pub async fn run() -> Result<(), Box<dyn std::error::Error>> {
cli_run::run().await
}
pub async fn run_cli_from_parsed(
args: config::cli::ParsedCliArgs,
) -> Result<(), Box<dyn std::error::Error>> {
Box::pin(cli_run::run_cli_from_parsed(args)).await
}
pub use config::{
AgentConfig, ExposeSecret, LlmHttpAuthMode, PlannerExecutorMode, SharedAgentConfig,
load_config, load_config_for_cli,
};
pub use llm::{
ChatCompletionsBackend, CompleteChatRetryingParams, E2eMode, OPENAI_COMPAT_BACKEND,
OpenAiCompatBackend, StreamChatParams, TraceEvent, TraceSink, default_chat_completions_backend,
shared_static_chat_backend,
};
pub use crate::cm_memory::memory::long_term_memory::LongTermMemoryRuntime;
pub use observability::TracingChatTurn;
pub use tool_registry::{
ToolDispatchMeta, ToolExecutionClass, WebToolRuntime, all_dispatch_metadata,
execution_class_for_tool, is_readonly_tool, try_dispatch_meta,
};
pub use tools::dev_tag;
pub use tools::{ToolsBuildOptions, build_tools, build_tools_filtered, build_tools_with_options};
pub use types::{
ChatRequest, FunctionCall, LlmSeedOverride, Message, ToolCall, message_content_as_str,
};
pub use runtime::cli_exit::{
CliExitError, EXIT_GENERAL, EXIT_MODEL_ERROR, EXIT_QUOTA_OR_RATE_LIMIT,
EXIT_TOOL_REPLAY_MISMATCH, EXIT_TOOLS_ALL_RUN_COMMAND_DENIED, EXIT_USAGE,
classify_model_error_message,
};
#[cfg(test)]
#[path = "lib/tests.rs"]
mod tests;